#include "WordTranslator.h"
#include "WRApiRequester.h"
#include <QTextStream>
#include <QEventLoop>
#include <QtDebug>
#include <QVariant>
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QXmlStreamWriter>
#include <QSettings>

// Default DTD string for XHTML generation
static const QString defaultDTDString =
	QString("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">");
// Default WordReference API URL
static const QString defaultWRUrl = QString("http://api.wordreference.com/");
// Default WordReference API Key
static const QString defaultWRAPIKey = QString("INSERT_YOUR_OWN_KEY");
// Default WordReference Dictionary (english/spanish)
static const QString defaultWRDictionary = QString("enes");

// Default CSS style
static const QString defaultCSSStyle = QString("\n\
body {\n\
	}\n\
div.hr {\n\
	margin-left: auto;\n\
	margin-right: auto;\n\
	width: 80%;\n\
	border-top-style: groove;\n\
	border-bottom-style: hidden;\n\
	border-left-style: hidden;\n\
	border-right-style: hidden;\n\
	}\n\
div.hr hr {\n\
	display: none;\n\
	}\n\
.list {\n\
    display: block;\n\
    list-style-type: disc;\n\
    margin-bottom: 0.75em;\n\
    margin-right: 0.75em;\n\
    margin-top: 0.75em\n\
	}\n\
.listItem {\n\
    display: list-item;\n\
    margin-bottom: 0.3em;\n\
    margin-top: 0.3em;\n\
	}\n\
.line-separator {\n\
	margin-left: auto;\n\
	margin-right:auto;\n\
	width: 60%;\n\
	border-top-style: groove;\n\
	border-bottom-style: hidden;\n\
	border-left-style: hidden;\n\
	border-right-style: hidden;\n\
	}\n\
.origTerm {\n\
	font-weight: bold;\n\
	}\n\
.term {\n\
	}\n\
.pos {\n\
	color: blue;\n\
	font-style: italic;\n\
	}\n\
.sense {\n\
	font-size: 0.875em;\n\
	font-style: italic;\n\
	}\n\
.usage {\n\
	}\n\
");

WordTranslator::WordTranslator(int& argc, char** argv, QSettings* settings)
	: QCoreApplication(argc, argv), _settings(settings)
{

}

bool WordTranslator::translate(const QString& word, QXmlStreamWriter& writer)
{
	// Creamos un requester para traducir la palabra
	WRApiRequester requester(word, _settings);
	requester.startRequest();
	// Procesaré el bucle de eventos hasta que me llegue la respuesta de la traducción
	QEventLoop loop;
	QObject::connect(&requester, SIGNAL(done()), &loop, SLOT(quit()));
	loop.exec();

	// Si se ha producido algún error, lo mostramos
	if (requester.hasError()) {
		qDebug() << requester.getErrorString();
	} else {
		requester.dump(writer);
	}

	qDebug() << "Borro el requester";

	return true;
}

void WordTranslator::world()
{
	// If we don't have a config file, we create the default configuration
	if ( !QFileInfo(_settings->fileName()).exists() ) {
		_settings->setValue("WordReference/API/URL", defaultWRUrl);
		_settings->setValue("WordReference/API/key", defaultWRAPIKey);
		_settings->setValue("WordReference/API/Dictionary", defaultWRDictionary);
		_settings->setValue("XHTML/DTDString", defaultDTDString);
		_settings->setValue("XHTML/CSS", defaultCSSStyle);
		_settings->setValue("XHTML/OutputFile", QString("%1/%2.html").arg(QDir::homePath(), _settings->organizationName()));
	}

	// We open the output file
	QFile salida(_settings->value("XHTML/OutputFile").toString());
	salida.open(QIODevice::WriteOnly | QIODevice::Truncate);
	QXmlStreamWriter stream(&salida);

	stream.setAutoFormatting(true);

	// Comenzamos el documento
	stream.writeStartDocument();
	// Escribimos la sección DTD
	stream.writeDTD(_settings->value("XHTML/DTDString").toString());

	// Añadimos la sección html
	stream.writeStartElement("html");
	stream.writeAttribute("xmlns", "http://www.w3.org/1999/xhtml");

	// Añadimos la sección head
	stream.writeStartElement("head");
		// Añadimos la sección title
		stream.writeTextElement("title", "Probando");

		// Añadimos la seccion style
		stream.writeStartElement("style");
		stream.writeAttribute("type", "text/css");
		stream.writeComment(_settings->value("XHTML/CSS").toString());
		stream.writeEndElement(); // style
	stream.writeEndElement(); // head

	// Añadimos la sección body
	stream.writeStartElement("body");

	// Traducimos las palabras
//	translate("abide", stream);
	translate("hello", stream);
	translate("put", stream);


	// Cerramos las etiquetas pendiente y terminamos el documento
	stream.writeEndElement(); // body
	stream.writeEndElement(); // html
	stream.writeEndDocument();
	// Cerramos el archivo de salida
	salida.close();

	QTextStream qout(stdout);
	qout << "Hello, world!\n";
	emit done();
	quit();
}


